/*
 * @Descripttion: 
 * @version: 
 * @Author: 宣某人
 * @Date: 2020-05-11 13:17:40
 * @LastEditors: 许振富(jia)
 * @LastEditTime: 2021-10-27 09:08:22
 */
#ifndef __KEY_H
#define __KEY_H

#ifdef __cplusplus
extern "C" {
#endif

// #define Key_UP
// #define Key_Down
// #define Key_Left
// #define Key_Right
// #define Key_Enter


/* 根据应用程序的功能重命名按键宏 */

/* 按键ID, 主要用于bsp_KeyState()函数的入口参数 */
typedef enum
{
    KID_K1 = 0
} KEY_ID_E;

/*
	按键滤波时间50ms, 单位10ms。
	只有连续检测到50ms状态不变才认为有效，包括弹起和按下两种事件
	即使按键电路不做硬件滤波，该滤波机制也可以保证可靠地检测到按键事件
*/
#define KEY_FILTER_TIME 20
#define KEY_LONG_TIME 100 /* 单位10ms， 持续1秒，认为长按事件 */

/*
	每个按键对应1个全局的结构体变量。
*/
typedef struct
{
    /* 下面是一个函数指针，指向判断按键手否按下的函数 */
    unsigned char (*IsKeyDownFunc)(void); /* 按键按下的判断函数,1表示按下 */

    unsigned char Count;       /* 滤波器计数器 */
    unsigned short LongCount;  /* 长按计数器 */
    unsigned short LongTime;   /* 按键按下持续时间, 0表示不检测长按 */
    unsigned char State;       /* 按键当前状态（按下还是弹起） */
    unsigned char RepeatSpeed; /* 连续按键周期 */
    unsigned char RepeatCount; /* 连续按键计数器 */
} KEY_T;

/*
	定义键值代码, 必须按如下次序定时每个键的按下、弹起和长按事件
*/
typedef enum
{
    KEY_NONE = 0, /* 0 表示按键事件 */

    KEY_1_DOWN, /* 1键按下 */
    KEY_1_UP,   /* 1键弹起 */
    KEY_1_LONG, /* 1键长按 */

    KEY_2_DOWN, /* 2键按下 */
    KEY_2_UP,   /* 2键弹起 */
    KEY_2_LONG, /* 2键长按 */

    KEY_3_DOWN, /* 3键按下 */
    KEY_3_UP,   /* 3键弹起 */
    KEY_3_LONG, /* 3键长按 */

    KEY_4_DOWN, /* 4键按下 */
    KEY_4_UP,   /* 4键弹起 */
    KEY_4_LONG, /* 4键长按 */

    KEY_5_DOWN, /* 4键按下 */
    KEY_5_UP,   /* 4键弹起 */
    KEY_5_LONG, /* 4键长按 */

} KEY_ENUM;

/* 按键FIFO用到变量 */
#define KEY_FIFO_SIZE 10
typedef struct
{
    unsigned char Buf[KEY_FIFO_SIZE]; /* 键值缓冲区 */
    unsigned char Read;               /* 缓冲区读指针1 */
    unsigned char Write;              /* 缓冲区写指针 */
    unsigned char Read2;              /* 缓冲区读指针2 */
} KEY_FIFO_T;

/* 供外部调用的函数声明 */
void Key_Init(void);
void  Key_Scan10ms(void);
void Key_Put(unsigned char _KeyCode);
unsigned char Key_Get(void);
unsigned char Key_GetState(KEY_ID_E _ucKeyID);
void Set_KeyParam(unsigned char _ucKeyID, unsigned short _LongTime, unsigned char _RepeatSpeed);
void Clear_Key(void);

#ifdef __cplusplus
}
#endif

#endif
